1 Introducción

1.1 Contexto/Motivación

El mercado de los videojuegos, un área de interés común para los integrantes del grupo, ha crecido muchísimo en los últimos años. Esto se aprecia tanto al observar la cantidad de personas aficionadas a este hobby, la variedad de juegos publicados cada año, y los avances en gráficos y otras tecnologías que se ha logrado con el tiempo.

Resulta interesante además porque plataformas como Steam e Itch.io permiten que desarrolladores independientes o grupos pequeños de éstos puedan ser visibilizados y publicar sus juegos sin necesitar de grandes inversiones, volviendo alcanzable ingresar y/o dedicarse al área.

1.2 Datos de estudio

El dataset escogido para el proyecto corresponde a información respecto a videojuegos recopilada de la plataforma Steam. Fue obtenido originalmente de Kaggle.

1.3 Planteamiento del problema

Por un lado, considerando que se ha presenciado en persona la evolución de los videojuegos, resulta atractiva la idea de encontrar (más allá de la impresión personal que se pueda tener) evidencia tangible de tendencias que se han dado respecto a los juegos con el paso de los años.

Observando lo vigente que resulta el área, y aprovechando la oportunidad del proyecto de este curso, se aspirará también a identificar patrones que puedan resultar provechosos al momento de elegir ciertas características que tendrá un juego, tal que incluirlos pueda significar un mayor interés por parte del público.

2 Exploración de datos

La descarga consta de 6 archivos, donde la información más importante respecto a los juegos se encuentra en steam.csv.

2.1 Descripción

A continuación se describen los atributos de la tabla principal, steam.csv.

  • appid: Identificador (único) de cada juego.
  • name: Título del videojuego.
  • release_date: Fecha de lanzamiento (formato AAAA-MM-DD).
  • english: Si el juego fue lanzado o no en inglés (1 o 0).
  • developer: Desarrolladores (separados con punto y coma en caso de haber más de uno).
  • publisher: Distribuidores (separados con punto y coma).
  • required_age: Edad mínima requerida para jugar, según rating PEGI UK (0 equivale a sin rating).
  • steamspy_tags: Géneros a los que pertenece un juego según votación de la comunidad SteamSpy (separados con punto y coma).
  • achievements: Número de logros que incluye el juego.
  • positive_ratings: Cantidad de votos positivos otorgados.
  • negative_ratings: Cantidad de votos negativos otorgados.
  • average_playtime: Tiempo de juego promedio de los usuarios, en minutos.
  • median_playtime: Mediana del tiempo de juego de los usuarios, en minutos.
  • owners: Rangos estimados de la cantidad de usuarios que descargaron un juego.
  • price: Precio estándar del juego (en GBP o libras esterlinas).

Para mayor facilidad en la interpretación de los precios fue necesario convertirlos a la moneda local (CLP). No confundir con los precios reales en la tienda de Chile.

Adicionalmente, existen otros atributos que de forma similar a las compañías desarrolladoras y distribuidoras, se encontraban separadas con punto y coma, pero al ser una cantidad de opciones más reducida, se decidió pre-procesar los datos y transformar cada uno de los atributos en columnas adicionales indicando si incluyen o no cierta característica, entre todas las opciones posibles. Corresponden a los siguientes:

  • platforms: Plataformas (PC) soportadas.
  • categories: Características adicionales de los juegos, como soporte de tecnologías y cantidad de jugadores permitidos.
  • genres: Géneros con los que se clasificó el juego.

El dataset original no contiene elementos vacíos (NaN) y posee 27075 observaciones que corresponden a los juegos presentes en la plataforma steam.

2.2 Preprocesamiento de la base de datos

if (!require('tidyverse')) install.packages('tidyverse'); library('tidyverse')
if (!require('splitstackshape')) install.packages('splitstackshape'); library('splitstackshape')
  
steam <- read.csv("data/steam.csv", encoding = "UTF-8", as.is = F)

platforms <- str_split(steam$platforms, ";")
categories <- str_split(steam$categories, ";")
genres <- str_split(steam$genres, ";")

platforms <- unlist(platforms)
categories <- unlist(categories)
genres <- unlist(genres)

platforms <- unique(platforms)
categories <- unique(categories)
genres <- unique(genres)

steam <- cSplit(steam, "platforms", sep=";")
steam <- cSplit(steam, "categories", sep=";")
steam <- cSplit(steam, "genres", sep=";")

for (i in platforms){
  steam <- steam %>%
    mutate(!!i := if_any(starts_with("platforms"), ~ ifelse(.x == i,1,0))) 
}

for (i in categories){
  steam <- steam %>%
    mutate(!!i := if_any(starts_with("categories"), ~ ifelse(.x == i,1,0))) 
}

for (i in genres){
  steam <- steam %>%
    mutate(!!i := if_any(starts_with("genres"), ~ ifelse(.x == i,1,0))) 
}

GBP_TO_CLP_RATE <- 1085
steam$price <- round(steam$price * GBP_TO_CLP_RATE)

steam <- steam %>%
  mutate_at(c(53:113), ~ifelse(is.na(.x)==T | .x ==F,0,1))

2.3 Atributos numéricos

Medidas de tendencia central, dispersión y rango de variables númericas.

steam %>%
  select(achievements,positive_ratings,negative_ratings,average_playtime,median_playtime,
         price) %>%
  summary()
##   achievements     positive_ratings  negative_ratings average_playtime  
##  Min.   :   0.00   Min.   :      0   Min.   :     0   Min.   :     0.0  
##  1st Qu.:   0.00   1st Qu.:      6   1st Qu.:     2   1st Qu.:     0.0  
##  Median :   7.00   Median :     24   Median :     9   Median :     0.0  
##  Mean   :  45.25   Mean   :   1001   Mean   :   211   Mean   :   149.8  
##  3rd Qu.:  23.00   3rd Qu.:    126   3rd Qu.:    42   3rd Qu.:     0.0  
##  Max.   :9821.00   Max.   :2644404   Max.   :487076   Max.   :190625.0  
##  median_playtime        price       
##  Min.   :     0.0   Min.   :     0  
##  1st Qu.:     0.0   1st Qu.:  1834  
##  Median :     0.0   Median :  4329  
##  Mean   :   146.1   Mean   :  6595  
##  3rd Qu.:     0.0   3rd Qu.:  7801  
##  Max.   :190625.0   Max.   :457859
  • Se observó que el atributo english no resultará muy útil pues casi todos los juegos están en inglés (lo que es esperable al ser Steam una plataforma originalmente en este idioma).
  • La mayoría de los juegos tiene una cantidad baja de achievements, aunque existen algunos que parecieran enfocarse en lo contrario y presentan un número absurdamente alto de logros.
  • Existe una clara tendencia a publicar opiniones positivas por sobre las negativas; en ambos casos habrá que tomar en cuenta una escala de positive_ratings y negative_ratings en caso de comparar juegos entre sí, pues sino los juegos “más populares” posiblemente terminarían opacando a los demás.
  • Resulta interesante observar más de la mitad de los juegos agregados a las bibliotecas de los usuarios no son jugados: tanto average_playtime como median_playtime tienen mediana cero.
  • La mayor parte de los juegos tienen bajos precios (75% bajo $8000 CLP).

Dado que buena parte de los valores de las variables average_playtime y median_playtime están fuertemente concentrados en 0, a continución se muestran sus valores de tendencia central filtrando que sean mayor a cero (sólo para objetivos de análisis).

steam %>%
  select(average_playtime,median_playtime) %>% 
  filter(average_playtime>0 & median_playtime>0) %>%
  summary()
##  average_playtime   median_playtime   
##  Min.   :     1.0   Min.   :     1.0  
##  1st Qu.:    77.0   1st Qu.:    77.0  
##  Median :   222.0   Median :   228.0  
##  Mean   :   657.4   Mean   :   640.9  
##  3rd Qu.:   365.0   3rd Qu.:   371.0  
##  Max.   :190625.0   Max.   :190625.0

2.3.1 Achievements

Una enorme cantidad de juegos no tiene logros: un 43% del total.

# Juegos sin achievements:
steam %>% filter(achievements==0) %>% nrow()
## [1] 11864
# Juegos con 1 o más achievements:
steam %>% filter(achievements!=0) %>% nrow()
## [1] 15211

Para estudiar un poco más la distribución de la cantidad de logros se descartaron los casos donde no habían. En general parecen centrarse alrededor de 20 logros. Se observa una pequeña tendencia de juegos con más logros a llegar a un número cerrado (50), pero fuera de esta anomalía lo esperable es que una mayor cantidad de logros se vuelve cada vez más inusual.

ggplot(steam[steam$achievements<100 & steam$achievements>0,], aes(x = achievements)) +
  geom_density() + ggtitle("Densidad de distribución de achievements mayores a 0 y menores a 100")

2.3.2 Ratings

A continuación, se muestran los tabulados correspondientes a los 10 juegos con mayor cantidad de positive_ratings, de negative_ratings y también de una variable auxiliar rating_neto que corresponde a la diferencia entre los positive_ratings y negative_ratings.

steam %>% 
  select(name,positive_ratings) %>%
  arrange(-positive_ratings) %>%
  head(10)
##                                 name positive_ratings
##  1: Counter-Strike: Global Offensive          2644404
##  2:                           Dota 2           863507
##  3:                  Team Fortress 2           515879
##  4:    PLAYERUNKNOWN'S BATTLEGROUNDS           496184
##  5:                      Garry's Mod           363721
##  6:               Grand Theft Auto V           329061
##  7:                         PAYDAY 2           308657
##  8:                         Unturned           292574
##  9:                         Terraria           255600
## 10:                    Left 4 Dead 2           251789
steam %>% 
  select(name,negative_ratings) %>%
  arrange(-negative_ratings) %>%
  head(10)
##                                 name negative_ratings
##  1:    PLAYERUNKNOWN'S BATTLEGROUNDS           487076
##  2: Counter-Strike: Global Offensive           402313
##  3:                           Dota 2           142079
##  4:               Grand Theft Auto V           139308
##  5:                 Z1 Battle Royale            91664
##  6:                             DayZ            77169
##  7:            ARK: Survival Evolved            66603
##  8:  Tom Clancy's Rainbow Six® Siege            59620
##  9:                         PAYDAY 2            56523
## 10:                     No Man's Sky            56488
steam %>% 
  mutate(rating_neto = positive_ratings - negative_ratings) %>%
  select(name,rating_neto) %>%
  arrange(-rating_neto) %>%
  head(10)
##                                 name rating_neto
##  1: Counter-Strike: Global Offensive     2242091
##  2:                           Dota 2      721428
##  3:                  Team Fortress 2      481843
##  4:                      Garry's Mod      347288
##  5:                         Unturned      261092
##  6:                         PAYDAY 2      252134
##  7:                         Terraria      247803
##  8:                    Left 4 Dead 2      243371
##  9:      The Elder Scrolls V: Skyrim      222352
## 10:                   Rocket League®      220745

2.3.3 Tiempos de juego

A continuación se muestran los 10 juegos con mayor average_playtine y median_playtime. Cabe mencionar que los resultados obtenidos abren muchas dudas de la fiabilidad y validez de estas variables ya que luego de realizar un análisis cualitativo de varios de estos juegos pudimos concluir que no es esperable que posean tantas horas de juegos. Dado lo anterior, hemos decidido continuar con cautela respecto a estas variables y seguir investigando si pudiesen contener errores o outliers muy extremos.

steam %>% 
  select(name,average_playtime) %>%
  arrange(-average_playtime) %>%
  head(10)
##                                       name average_playtime
##  1:            The Abbey of Crime Extensum           190625
##  2:              The Banner Saga: Factions            95245
##  3:   The Secret of Tremendous Corporation            95242
##  4:                                  PRICE            63481
##  5:                              Boundless            55204
##  6: Shroud of the Avatar: Forsaken Virtues            54618
##  7:                             X-Plane 11            44169
##  8:                             懒人修仙传            43632
##  9:                        Fantasy Grounds            43074
## 10:                                Screeps            38805
steam %>% 
  select(name,median_playtime) %>%
  arrange(-median_playtime) %>%
  head(10)
##                                       name median_playtime
##  1:            The Abbey of Crime Extensum          190625
##  2:              The Banner Saga: Factions          190489
##  3:   The Secret of Tremendous Corporation          190445
##  4:                        Fantasy Grounds           86148
##  5:                             懒人修仙传           71857
##  6:                                  PRICE           63490
##  7:                              Boundless           55204
##  8: Shroud of the Avatar: Forsaken Virtues           54618
##  9:                             X-Plane 11           44169
## 10:                                Screeps           38805

2.3.4 Precio

A continuación, se muestran los 10 juegos con mayor precio en steam y también se incluyen dos tablas de los 10 juegos gratis (precio = 0) con mayor cantidad de ratings positivos y negativos.

steam %>% 
  select(name,price) %>%
  arrange(-price) %>%
  head(10)
##                              name  price
##  1:            ADR-Labelling Game 457859
##  2:        GameMaker Studio 2 UWP 329829
##  3:                 Houdini Indie 227839
##  4: 3DF Zephyr Lite Steam Edition 168164
##  5:   Tactics: Bludgeons Blessing 168164
##  6:                    Silhouette 168164
##  7:     GameMaker Studio 2 Mobile 168164
##  8:                CrisisActionVR 168164
##  9:                Tactics 2: War 168164
## 10:                    Bible Test 168164
steam %>% 
  filter(price == 0) %>%
  select(name,positive_ratings) %>%
  arrange(-positive_ratings) %>%
  head(10)
##                                 name positive_ratings
##  1: Counter-Strike: Global Offensive          2644404
##  2:                           Dota 2           863507
##  3:                  Team Fortress 2           515879
##  4:                         Unturned           292574
##  5:                         Warframe           226541
##  6:                        Paladins®           169580
##  7:      Life is Strange - Episode 1           118634
##  8:                 Z1 Battle Royale           111434
##  9:       Doki Doki Literature Club!           108556
## 10:                      War Thunder            83852
steam %>% 
  filter(price == 0) %>%
  select(name,negative_ratings) %>%
  arrange(-negative_ratings) %>%
  head(10)
##                                 name negative_ratings
##  1: Counter-Strike: Global Offensive           402313
##  2:                           Dota 2           142079
##  3:                 Z1 Battle Royale            91664
##  4:                Heroes & Generals            34416
##  5:                  Team Fortress 2            34036
##  6:                        Paladins®            32407
##  7:                         Unturned            31482
##  8:                        Robocraft            30987
##  9:                      War Thunder            22166
## 10:                         Warframe            20268

2.4 Atributos Categóricos

2.4.1 Año de lanzamiento

Vale la pena destacar que los datos consideran desde el año 1997 hasta 2019. Hay muy pocos juegos para los primeros años de la plataforma, así que se observó con mayor atención los años siguientes.

steam %>%
  group_by(year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x=year,y=n, label=n)) + geom_bar(stat = 'identity') +
  xlab("año") + 
  ylab("cantidad") +
  geom_text(vjust = -0.5, colour = "black", size = 2.5) + 
  ggtitle("Cantidad de juegos publicados en la plataforma Steam según año")

Como los datos fueron recolectados en 2019, es esperable que no se tenga información completa respecto al último año; fuera de este caso, la cantidad de juegos lanzados parece aumentar cada año.

# Confirmando el juego más reciente en la tabla (mes):
steam %>%
  filter(year==2019) %>% select(month) %>% arrange(-month) %>% head(1)
##    month
## 1:     5

Bajo esta consideración, también puede resultar interesante ver cómo se distribuyen a través del año.

steam %>%
  group_by(year, month) %>%
  summarise(n = n()) %>%
  ggplot(aes(x= as.factor(month), y=n, label=n)) + geom_bar(stat = 'identity') +
  xlab("mes") +
  ylab("cantidad") + ggtitle("Cantidad de juegos publicados en plataforma Steam según el mes")

2.4.2 Plataformas

En este apartado se puede ver la distribución de las plataformas a lo largo del dataframe steam.

if (!require('reshape')) install.packages('reshape'); library('reshape')

steam %>%
  select(windows,mac,linux) %>%
  summarise_all(sum) %>%
  melt() %>%
  ggplot(aes(variable,value, label = value)) + 
  geom_bar(stat = 'identity') +
  geom_text(vjust = 4, colour = "white") +
  xlab("plataformas") +
  ylab("cantidad") + ggtitle("Juegos disponibles según plataforma (no excluyentes)")

Solo hay 3 plataformas en PC, siendo liderado por Windows.

steam %>%
  mutate(aux_excl = windows + mac + linux) %>%
  mutate(windows_excl = ifelse(windows == 1 & aux_excl == 1,1,0),
         mac_excl = ifelse(mac == 1 & aux_excl == 1,1,0),
         linux_excl = ifelse(linux == 1 & aux_excl == 1,1,0)) %>%
  select(windows_excl,mac_excl,linux_excl) %>%
  summarise_all(sum) %>%
  melt()
##       variable value
## 1 windows_excl 18398
## 2     mac_excl     3
## 3   linux_excl     1

Más aún, prácticamente nadie crea contenido exclusivo para Mac o Linux. Lo común es que los desarrolladores liberen sus juegos en Windows, y en ocasiones también deciden agregar otras plataformas.

2.4.3 Desarrolladores

steam %>% select(developer) %>% unique() %>% nrow()
## [1] 17113

Existen muchísimos desarrolladores en Steam; posiblemente la mayoría de estos solo publican un único juego:

steam %>% 
  group_by(developer) %>%
  summarise(n = n()) %>%
  filter(n==1) %>%
  nrow()
## [1] 13266

Por su parte, algunos de los desarrolladores que producen más contenido son:

steam %>% 
  group_by(developer) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  head(10)
## # A tibble: 10 x 2
##    developer                        n
##    <fct>                        <int>
##  1 "Choice of Games"               94
##  2 "KOEI TECMO GAMES CO., LTD."    72
##  3 "Ripknot Systems"               62
##  4 "Laush Dmitriy Sergeevich"      51
##  5 "Nikita \"Ghost_RUS\""          50
##  6 "Dexion Games"                  45
##  7 "RewindApp"                     43
##  8 "Hosted Games"                  42
##  9 "Blender Games"                 40
## 10 "For Kids"                      36

2.4.4 Distribuidores

steam %>% select(publisher) %>% unique() %>% nrow()
## [1] 14354

Las compañías distribuidoras también son muchísimas como para analizarlas individualmente. Se comporta de forma similar a los desarrolladores: gran parte de ellos se asocia solo a un juego.

steam %>% 
  group_by(publisher) %>%
  summarise(n = n()) %>%
  filter(n==1) %>%
  nrow()
## [1] 11047

Algunas de las distribuidoras con más juegos a su nombre son:

steam %>% 
  group_by(publisher) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  head(10)
## # A tibble: 10 x 2
##    publisher               n
##    <fct>               <int>
##  1 Big Fish Games        212
##  2 Strategy First        136
##  3 Ubisoft               111
##  4 THQ Nordic             98
##  5 Square Enix            97
##  6 Sekai Project          96
##  7 Choice of Games        94
##  8 1C Entertainment       88
##  9 Dagestan Technology    88
## 10 SEGA                   78

2.4.5 Edad requerida

Existen un total de 6 categorías según el sistema inglés.

unique(steam$required_age)
## [1]  0 18 16 12  7  3

La mayor parte de los juegos no indican un rating:

steam %>% count(required_age)
##    required_age     n
## 1:            0 26479
## 2:            3    11
## 3:            7    12
## 4:           12    73
## 5:           16   192
## 6:           18   308

Sin embargo, esto puede deberse a que solo es importante etiquetarlos cuando se trata de juegos para mayores de edad, y que por eso la tendencia sea a aumentar la cantidad con el rating de edad.

2.4.6 Categorías

Existe un total de 29 categorías únicas:

categories
##  [1] "Multi-player"               "Online Multi-Player"       
##  [3] "Local Multi-Player"         "Valve Anti-Cheat enabled"  
##  [5] "Single-player"              "Steam Cloud"               
##  [7] "Steam Achievements"         "Steam Trading Cards"       
##  [9] "Captions available"         "Partial Controller Support"
## [11] "Includes Source SDK"        "Cross-Platform Multiplayer"
## [13] "Stats"                      "Commentary available"      
## [15] "Includes level editor"      "Steam Workshop"            
## [17] "In-App Purchases"           "Co-op"                     
## [19] "Full controller support"    "Steam Leaderboards"        
## [21] "SteamVR Collectibles"       "Online Co-op"              
## [23] "Shared/Split Screen"        "Local Co-op"               
## [25] "MMO"                        "VR Support"                
## [27] "Mods"                       "Mods (require HL2)"        
## [29] "Steam Turn Notifications"

Algunas de las más frecuentes son:

steam %>%
  select(55:83) %>%
  summarise_all(sum) %>%
  melt() %>%
  arrange(-value) %>%
  head(10)
##                      variable value
## 1               Single-player 25678
## 2          Steam Achievements 14130
## 3         Steam Trading Cards  7918
## 4                 Steam Cloud  7219
## 5     Full controller support  5695
## 6                       linux  5235
## 7  Partial Controller Support  4234
## 8                Multi-player  3974
## 9          Steam Leaderboards  3439
## 10        Online Multi-Player  2487

2.4.7 Géneros

También se identificaron un total de 29 géneros distintos:

genres
##  [1] "Action"                "Free to Play"          "Strategy"             
##  [4] "Adventure"             "Indie"                 "RPG"                  
##  [7] "Animation & Modeling"  "Video Production"      "Casual"               
## [10] "Simulation"            "Racing"                "Violent"              
## [13] "Massively Multiplayer" "Nudity"                "Sports"               
## [16] "Early Access"          "Gore"                  "Utilities"            
## [19] "Design & Illustration" "Web Publishing"        "Education"            
## [22] "Software Training"     "Sexual Content"        "Audio Production"     
## [25] "Game Development"      "Photo Editing"         "Accounting"           
## [28] "Documentary"           "Tutorial"

Algunos de los anteriores corresponden a géneros de software y no necesariamente de juegos. Sin embargo, los más frecuentes se corresponden con géneros más bien conocidos de videojuegos.

(popular_genres <- steam %>% 
  select(84:112) %>%
  summarise_all(sum) %>%
  melt() %>%
  arrange(-value) %>%
  head(15))
##                 variable value
## 1                  Indie 19421
## 2                 Action 11903
## 3                 Casual 10210
## 4              Adventure 10032
## 5               Strategy  5247
## 6             Simulation  5194
## 7                    RPG  4311
## 8           Early Access  2954
## 9           Free to Play  1704
## 10                Sports  1322
## 11                Racing  1024
## 12               Violent   843
## 13 Massively Multiplayer   723
## 14                  Gore   537
## 15                Nudity   266

2.4.8 Cantidad de dueños

Para distinguir de mejor forma los grupos se prefirió convertir el valor a numérico promediando ambos límites del rango entregado originalmente (dueños promedio).

owners <- str_split(steam$owners, "-")
owners <- unlist(owners)
owners <- unique(owners)
steam <- cSplit(steam, "owners", sep="-")

steam <- steam %>%
  mutate(duenos_promedio = (owners_1 + owners_2)/2)

Sin embargo, para conocer cuántos juegos hay por rango:

owners_lbl <- c("0-20k", "20k-50k", "50k-100k", "100k-200k", "200k-500k", "500k-1M", "1M-2M", "2M-5M", "5M-10M", "10M-20M", "20M-50M", "50M-100M", "100M-200M")
steam %>%
  group_by(duenos_promedio) %>%
  summarise(n=n()) %>%
  ggplot() +
  scale_y_log10() +
  geom_bar(aes(x=as.factor(duenos_promedio), y=n), stat="identity") +
  scale_x_discrete(labels=owners_lbl) +
  ylab("cantidad") +
  xlab("rangos de cantidad de dueños") +
  coord_flip() + ggtitle("Frecuencia de rangos de cantidades de dueños")

2.5 Analizando relaciones

En este apartado se realizan transformaciones logarítmicas a algunas variables para suavizar las observaciones y distribuciones.

2.5.1 Precio vs Cantidad de dueños

steam %>% 
  filter(price < 50000 & duenos_promedio < 50000000 & duenos_promedio > 0) %>%
  ggplot(aes(x=log(price),y=log(duenos_promedio))) +
  geom_point(aes(alpha=0.05), show.legend = F) +
  xlab("log(precio (CLP))") +
  ylab("log(dueños promedio)") + ggtitle("Scatter plot entre log de precio y log de dueños promedio")

En general, los juegos tienden a tener precios bajos; conforme crecen tienden a agruparse en ciertos precios “estándar”. Por otro lado, los juegos con más descargas son gratis, concentrándose hacia precios cada vez más pequeños conforme aumentan los rangos de dueños. A pesar de lo anterior, no se aprecia una correlación clara entre las variables.

2.5.2 Precio vs Ratings positivos

steam %>% 
  filter(price<100000) %>%
  ggplot(aes(x=log(price),y=log(positive_ratings))) +
  geom_point() + 
  xlab("log(precio (CLP))") +
  ylab("log(ratings positivos)") + ggtitle("Scatter plot entre log de precio y log de ratings positivos")

Al igual que en el ejemplo anterior no se aprecia una correlación clara entre log(precio) y log(ratings_positivos) y si la hubiera, pareciera ser levemente positiva entre las dos variables.

2.5.3 Desarrolladores más elogiados

steam %>% 
  group_by(developer) %>%
  summarise(media_pos = mean(positive_ratings)) %>%
  arrange(-media_pos) %>%
  head(10)
## # A tibble: 10 x 2
##    developer                                                          media_pos
##    <fct>                                                                  <dbl>
##  1 Valve;Hidden Path Entertainment                                     2644404 
##  2 PUBG Corporation                                                     496184 
##  3 OVERKILL - a Starbreeze Studio.                                      308657 
##  4 Smartly Dressed Games                                                292574 
##  5 Re-Logic                                                             255600 
##  6 Psyonix, Inc.                                                        242561 
##  7 Evil Mojo Games                                                      169580 
##  8 Facepunch Studios                                                    146078.
##  9 Studio Wildcard;Instinct Games;Efecto Studios;Virtual Basement LLC   145035 
## 10 Gearbox Software;Aspyr (Mac);Aspyr (Linux)                           144595

2.5.4 Desarrolladores más criticados

steam %>% 
  group_by(developer) %>%
  summarise(media_neg = mean(negative_ratings)) %>%
  arrange(-media_neg) %>%
  head(10)
## # A tibble: 10 x 2
##    developer                                                          media_neg
##    <fct>                                                                  <dbl>
##  1 PUBG Corporation                                                      487076
##  2 Valve;Hidden Path Entertainment                                       402313
##  3 NantG                                                                  91664
##  4 Studio Wildcard;Instinct Games;Efecto Studios;Virtual Basement LLC     66603
##  5 OVERKILL - a Starbreeze Studio.                                        56523
##  6 Rockstar North                                                         34947
##  7 RETO MOTO                                                              34416
##  8 Evil Mojo Games                                                        32407
##  9 Smartly Dressed Games                                                  31482
## 10 Ubisoft Montreal;Ubisoft Quebec;Ubisoft Toronto;Blue Byte              25920

2.5.5 Géneros más caros

steam %>%
  select(c(1,84:112,14)) %>%
  melt(id = c("appid","price")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_precio_genero = mean(price)) %>%
  arrange(-media_precio_genero) %>%
  head(10)
## # A tibble: 10 x 2
##    variable              media_precio_genero
##    <fct>                               <dbl>
##  1 Game Development                   66923.
##  2 Web Publishing                     43070.
##  3 Software Training                  34505.
##  4 Animation & Modeling               30084.
##  5 Design & Illustration              29097.
##  6 Education                          29066.
##  7 Photo Editing                      15888 
##  8 Utilities                          15616.
##  9 Video Production                   12285.
## 10 Audio Production                   12210.
steam %>%
  select(c(1,84:112,14)) %>%
  melt(id = c("appid","price")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_precio_genero = mean(price)) %>%
  arrange(-media_precio_genero) %>%
  head(10) %>%
  ggplot(aes(reorder(variable,-media_precio_genero),media_precio_genero)) +
  geom_bar(stat = 'identity') +theme(axis.text.x = element_text(angle = 90)) +
  xlab("géneros") +
  ylab("media precio") + ggtitle("Los 10 géneros con la media de precios más alta")

2.5.6 Géneros más económicos

steam %>%
  select(c(1,84:112,14)) %>%
  melt(id = c("appid","price")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_precio_genero = mean(price)) %>%
  arrange(media_precio_genero) %>%
  head(10)
## # A tibble: 10 x 2
##    variable              media_precio_genero
##    <fct>                               <dbl>
##  1 Free to Play                         108.
##  2 Accounting                          3157.
##  3 Documentary                         4318 
##  4 Tutorial                            4318 
##  5 Casual                              4455.
##  6 Massively Multiplayer               4687.
##  7 Indie                               5479.
##  8 Gore                                6480.
##  9 Adventure                           6642.
## 10 Action                              6662.
steam %>%
  select(c(1,84:112,14)) %>%
  melt(id = c("appid","price")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_precio_genero = mean(price)) %>%
  arrange(media_precio_genero) %>%
  head(10) %>%
  ggplot(aes(reorder(variable,media_precio_genero),media_precio_genero)) +
  geom_bar(stat = 'identity') +theme(axis.text.x = element_text(angle = 90)) +
  xlab("géneros") +
  ylab("media precio") + ggtitle("Los 10 géneros con la media de precios más baja")

Algo particular de notar es que los juegos “free to play” tienen muy bajos precios pero se esperaría que fueran totalmente gratis (es decir, iguales a 0). Analizando un poco más detalle podemos ver que los 5 juegos más caros de la categoría “free to play” presentan precios bastantes más altos que 0. Esto nos lleva a pensar que puede estar ocurriendo que ciertas etiquetas de género estén mal identificadas o que existen juegos que hayan cambiado de género pero que el cambio no se haya visto reflejado en la base de datos.

steam %>% 
  filter(`Free to Play` == 1) %>%
  select(name,price) %>%
  arrange(-price) %>%
  head(5)
##                    name price
## 1:          VR Paradise 21689
## 2:            Sexy Miss 15179
## 3:     Invisigun Heroes 12358
## 4: Apocalypse Mechanism 12358
## 5:    Conqueror's Blade 12358

2.5.7 Géneros más descargados

steam %>%
  select(c(1,84:112,118)) %>%
  melt(id = c("appid","duenos_promedio")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_duenos_genero = mean(duenos_promedio)) %>%
  arrange(-media_duenos_genero) %>%
  head(10)
## # A tibble: 10 x 2
##    variable              media_duenos_genero
##    <fct>                               <dbl>
##  1 Massively Multiplayer             617220.
##  2 Free to Play                      592667.
##  3 Action                            198411.
##  4 RPG                               161648.
##  5 Animation & Modeling              150759.
##  6 Strategy                          146379.
##  7 Design & Illustration             126897.
##  8 Adventure                         109823.
##  9 Utilities                         102158.
## 10 Simulation                        101261.

2.5.8 Géneros menos descargados

steam %>%
  select(c(1,84:112,118)) %>%
  melt(id = c("appid","duenos_promedio")) %>%
  filter(value ==1) %>%
  group_by(variable) %>%
  summarise(media_duenos_genero = mean(duenos_promedio)) %>%
  arrange(media_duenos_genero) %>%
  head(10)
## # A tibble: 10 x 2
##    variable          media_duenos_genero
##    <fct>                           <dbl>
##  1 Documentary                    10000 
##  2 Tutorial                       10000 
##  3 Accounting                     14167.
##  4 Audio Production               14828.
##  5 Education                      29706.
##  6 Photo Editing                  33333.
##  7 Software Training              35806.
##  8 Game Development               39706.
##  9 Gore                           48017.
## 10 Violent                        48553.

2.5.9 Correlaciones lineales

if (!require('corrplot')) install.packages('corrplot'); library('corrplot')

steam %>%
  mutate(rating_neto = positive_ratings - negative_ratings) %>%
  select(positive_ratings,negative_ratings,rating_neto,average_playtime,median_playtime,
         price,duenos_promedio) %>%
  cor() 
##                  positive_ratings negative_ratings rating_neto average_playtime
## positive_ratings       1.00000000       0.76280427  0.98481975       0.15789760
## negative_ratings       0.76280427       1.00000000  0.63898269       0.16113987
## rating_neto            0.98481975       0.63898269  1.00000000       0.14457660
## average_playtime       0.15789760       0.16113987  0.14457660       1.00000000
## median_playtime        0.03577591       0.04788714  0.02970377       0.91490024
## price                  0.03610949       0.05125866  0.02919554       0.04924223
## duenos_promedio        0.71344799       0.69030563  0.66340301       0.17415654
##                  median_playtime      price duenos_promedio
## positive_ratings      0.03577591 0.03610949      0.71344799
## negative_ratings      0.04788714 0.05125866      0.69030563
## rating_neto           0.02970377 0.02919554      0.66340301
## average_playtime      0.91490024 0.04924223      0.17415654
## median_playtime       1.00000000 0.03661012      0.03598315
## price                 0.03661012 1.00000000      0.03107103
## duenos_promedio       0.03598315 0.03107103      1.00000000
steam %>%
  mutate(rating_neto = positive_ratings - negative_ratings) %>%
  select(positive_ratings,negative_ratings,rating_neto,average_playtime,median_playtime,
         price,duenos_promedio) %>%
  cor() %>%
  corrplot()

Con la información anterior podemos notar que la variable price no está fuertemente correlacionada con ninguna variable. Por otro lado, un aspecto interesante es el hecho que la cantidad de dueños promedio está fuertemente correlacionada positivamente con las variables de ratings. Esto hace concluir que la cantidad de ratings (ya sean positivos o negativos) podrían estar reflejando la popularidad de los juegos.

2.5.10 Precios de géneros de juego

steam %>%
  select(appid,price,Indie,Action,Casual,Adventure,Strategy) %>%
  melt(id = c("appid","price")) %>%
  group_by(variable) %>%
  filter(value == 1 & price<=20000) %>%
  ggplot(aes(variable,price)) + 
  geom_boxplot() +
  xlab("géneros") +
  ylab("precio") + ggtitle("Boxplots de precio de los 5 géneros más populares")

2.5.11 Cantidad de juegos de un género por año

if (!require('plotly')) install.packages('plotly'); library('plotly')

steam %>% 
  select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
  melt(id = c("appid","price","year","duenos_promedio")) %>%
  filter(value == 1 & year >=2006) %>%
  group_by(variable, year) %>%
  summarise(q_juegos = n()) %>%
  plot_ly(x=~year ,y = ~q_juegos,group = ~variable, color = ~variable ,type = "scatter" ,mode='lines+markers') %>%
  layout(xaxis=list(title="año"), yaxis=list(title="cantidad"), title = "Cantidad de nuevos juegos incluidos en la plataforma \n por año para los 5 géneros más populares") 

2.5.12 Evolución de la media de cantidad de dueños por año para los 5 géneros más populares

steam %>% 
  select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
  melt(id = c("appid","price","year","duenos_promedio")) %>%
  filter(value == 1 & year >=2006) %>%
  group_by(variable, year) %>%
  summarise(media_duenos = mean(duenos_promedio)) %>%
  plot_ly(x=~year ,y = ~media_duenos,group = ~variable, color = ~variable ,type = "scatter" ,mode='lines+markers') %>% layout(xaxis = list(range=c(2006,2020))) %>%
  layout(xaxis=list(title="año"), yaxis=list(title="cantidad de dueños media"), title = "Evolución de la media de cantidad de dueños por año \n para los 5 géneros más populares")

2.5.13 Variación de dueños promedio por año de lanzamiento

steam %>% 
  select(appid,price,year,duenos_promedio,Indie,Action,Casual,Adventure,Strategy) %>%
  melt(id = c("appid","price","year","duenos_promedio")) %>%
  filter(value == 1 & year >=2007) %>%
  group_by(variable, year) %>%
  summarise(media_duenos = mean(duenos_promedio)) %>%
  plot_ly(x=~year ,y = ~media_duenos,group = ~variable, color = ~variable ,type = "scatter" ,mode='markers', frame = ~year, size = 10) %>%
  layout(xaxis=list(title="año"), yaxis=list(title="cantidad de dueños media"))

3 Preguntas y problemas

  1. ¿Cómo ha evolucionado la cantidad de juegos que lanzan los desarrolladores en el tiempo?

  2. ¿Cómo decidir que un juego es/será popular entre los jugadores?

  3. ¿Qué factores afectan más en producir altos tiempos de juego? (cantidad de achievements o juegos multiplayer por ejemplo)

  4. ¿Cuáles son los géneros de juegos indie que producen más engagement? (mayores playtimes y más owners)